collections 模块 -> Python 中扩展的数据类型

1. nametuple('元组名称', list) -> 命名元组 -> 生成可以使用名字访问的元组

们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:

p = (1, 2)

但是,看到 (1, 2),很难看出这个tuple是用来表示一个坐标的。

这是,nametuple 就派上用场了:

from collections import namedtuple

Point = namedtuple('point', ['x', 'y'])  # point是坐标的意思
p = Point(1, 2)

print(p)  # point(x=1, y=2)
print(p.x)  # 1
print(p.y)  # 2

print(p[0])  # 1
print(p[1])  # 2

2. deque(list) -> 两端队列

使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向列表:

from collections import deque

dq = deque([1, 2])
dq.append('a')  # 从后面添加数据 [1, 2, 'a']
dq.appendleft('b')  # 从左边添加数据 ['b', 1, 2, 'a']
dq.insert(2, '插入的数据')  # 插入数据 ['b', 1, '插入的数据', 2, 'a']
print(dq.pop())  # a 从后面取数据(可以理解为删除数据)
print(dq.popleft())  # b 从左边取数据(可以理解为删除数据)
print(dq) # deque([1, '插入的数据', 2])

3. OrderedDict() -> 有序字典 -> 在 3.7 版本中字典默认有序

from collections import OrderedDict

od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])

print(od['a']) # 1

for k in od:
    print(k) # a b c

4. defaultdict(调用的函数的函数名或匿名函数-> 带有默认值的字典

有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。

即: {'k1': 大于66 , 'k2': 小于66}

values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]

my_dict = {}

for value in values:
    if value > 66:
        if 'k1' in my_dict:
            my_dict['k1'].append(value)
        else:
            my_dict['k1'] = [value]
    else:
        if 'k2' in my_dict:
            my_dict['k2'].append(value)
        else:
            my_dict['k2'] = [value]

print(my_dict)  # {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]}

使用dict时,如果引用的Key不存在,就要进行判断如果不判断就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:

from collections import defaultdict

my_dict = defaultdict(list)

values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]

for value in values:
    if value > 66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)

print(my_dict)  # defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]})

defaultdict() 的参数一定要是可被调用的函数的函数名或匿名函数

d_list = defaultdict(list)  # 字典默认值是列表
print(d_list['l'])  # []

d_dict = defaultdict(dict)  # 字典默认值是字典
print(d_dict['d'])  # {}

d_set = defaultdict(set) # 字典默认值是字典
print(d_set['s'])  # set()

d_other = defaultdict(lambda: 5)  # 如果想字典默认值是数字,字符串的时候就是用匿名函数

5. Counter() -> 用来跟踪值出现的次数

from collections import Counter

c = Counter('abcdeabcdabcaba')
print(c)  # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})

6. 其他的详细内容